package xyz.zhno.mall.product.web.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xyz.zhno.mall.common.core.util.BeanUtils;
import xyz.zhno.mall.common.core.util.StringUtils;
import xyz.zhno.mall.common.core.util.Validator;
import xyz.zhno.mall.common.mpg.entity.PmsBrand;
import xyz.zhno.mall.common.mpg.entity.PmsProduct;
import xyz.zhno.mall.common.mpg.mapper.PmsBrandMapper;
import xyz.zhno.mall.common.mpg.mapper.PmsProductMapper;
import xyz.zhno.mall.product.model.param.PmsBrandParam;
import xyz.zhno.mall.product.web.service.PmsBrandService;

/**
 * 品牌表业务层实现
 * @author zh_o
 */
@Service
@AllArgsConstructor
public class PmsBrandServiceImpl extends ServiceImpl<PmsBrandMapper, PmsBrand> implements PmsBrandService {

    private final PmsProductMapper productMapper;

    /**
     * 添加品牌
     * @param param 参数列表
     * @return 添加品牌的ID
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long create(PmsBrandParam param) {
        // 查询品牌,并且不允许存在相同名称品牌
        Validator.requireNull(
                getOne(new LambdaQueryWrapper<PmsBrand>()
                        .eq(PmsBrand::getName, param.getName())), "名称已存在");
        // 拷贝参数属性
        PmsBrand brand = BeanUtils.copyProperties(param, PmsBrand.class);
        // 若未设置首字母，取品牌名称第一位
        setFirstLetter(brand);
        // 新增品牌
        save(brand);
        return brand.getId();
    }

    /**
     * 修改品牌
     * @param id    需要修改品牌ID
     * @param param 参数列表
     * @return 修改品牌的ID
     */
    @Override
    public Long update(Long id, PmsBrandParam param) {
        // 查询品牌
        Validator.notNull(getById(id), "品牌不存在");
        // 拷贝参数属性
        PmsBrand brand = BeanUtils.copyProperties(param, PmsBrand.class);
        brand.setId(id);
        // 若未设置首字母，取品牌名称第一位
        setFirstLetter(brand);
        // 更新商品中品牌名称
        productMapper.update(
                new PmsProduct().setBrandName(brand.getName()),
                new LambdaQueryWrapper<PmsProduct>().eq(PmsProduct::getBrandId, id)
        );
        // 修改品牌信息
        updateById(brand);
        return brand.getId();
    }

    /**
     * 取品牌名称第一位为首字母
     * @param brand 品牌对象
     */
    private void setFirstLetter(PmsBrand brand) {
        if (StringUtils.isBlank(brand.getFirstLetter())) {
            brand.setFirstLetter(brand.getName().substring(0, 1));
        }
    }

}
